![EventBridgeスケジューラを使ってRedshift Serverlessに定期クエリを実行してみる](https://devio2023-media.developers.io/wp-content/uploads/2022/08/amazon-redshift.png)
EventBridgeスケジューラを使ってRedshift Serverlessに定期クエリを実行してみる
こんにちは、八木です。
Redshiftに定期的にクエリを実行したいケースは多いのではないでしょうか。
今回はRedshift Serverlessに対して、EventBridgeスケジューラを使って定期クエリを実行する方法をご紹介します。
先にまとめ
- Redshift Serverlessではクエリエディタ(v1)を使って定期クエリを実行することができない
- EventBridgeスケジューラを使えば、Redshift Serverlessで定期クエリを実行することができる
- ただしEventBridgeスケジューラではクエリのエラーが検出できないため注意
Redshiftで定期的にクエリを実行する方法
Redshiftを含むDWHでクエリを定期的にクエリを実行するには、Apache Airflowなどのワークフロー管理ツールを利用することが多いかと思います。
しかし管理リソースが増えたりと手間もかかるため、手軽にクエリをスケジュールするにはEventBridgeを利用することが可能です。
プロビジョンドクラスターに対してはクエリエディタ(v1)を利用してクエリスケジュール(実態はスケジュール実行のEventBridgeルール)を作成することが可能ですが、Redshift Serverlessに対応していません。
そこで今回利用するのが、EventBridgeスケジューラです。この機能は2022年10月にリリースされたばかりの機能で、スケジュール実行のEventBridgeルールと比べてより多彩なターゲットアクションを持っています。
この中のRedshift Data APIターゲットを使うことで、Redshift Serverlessに対してもクエリを実行することが可能になりました。
やってみた
ということで、早速動かしてみました。
前提
- Redshift Serverlessが作成済みである
Redshiftユーザの作成
Redshift Data APIの認証方法は「Secrets Managerを利用したユーザ名・パスワード認証」と「IAMを利用した一時認証」がありますが、今回はSecrets Managerを使用します。
まずRedshiftにCREATE USER
の権限を持つユーザでログインし、EventBridge用のRedshiftユーザを作成します。
CREATE USER eb_user_name PASSWORD 'eb_user_password';
Secrets Managerの作成
作成したRedshiftユーザの認証情報をSecrets Managerに保存します。
Secrets Managerのコンソールで「新しいシークレットを保存する」からRedshiftユーザの認証情報を保持するシークレットを作成します。
シークレットのタイプに「その他のシークレットのタイプ」を選択し、キー/値のペアにはusername
,password
でRedshiftユーザのユーザ名、パスワードをそれぞれ指定します。
EventBridgeスケジューラ用のIAMロールの作成
Redshift Data APIの利用権限を持つ、EventBridgeスケジューラ用のIAMロールを作成します。
以下のカスタム信頼ポリシーでIAMロールを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
また、許可ポリシーにはAdministratorAccess
を指定しました。
実際の運用には強すぎる権限なので、必要な権限のみに調整してください。
EventBridgeスケジューラの作成
EventBridgeコンソールからスケジューラを作成します。
今回の例ではスケジュールのパターンで5分ごとに実行するよう設定します。
「ターゲットの詳細」で「Amazon Redshift Data」→「ExecuteStatement」を選択します。
「入力」には以下のようなJSONを指定します。
{ "WorkgroupName": "default", "Database": "dev", "Sql": "SELECT 1 as id, 'yagi' as name;", "SecretArn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:dev/redshift-scheduled-query-demo-urk1UZ" }
WorkgroupName
にはRedshift Serverlessのワークグループ名、Database
にはクエリを実行したいデータベース名、Sql
には実行したいSQLを指定します。また、SecretArn
には先ほど作成したSecrets ManagerのARNを指定します。
アクセス許可には先に作成したIAMロールを選択します。
以上の設定を確認後、EventBridgeスケジューラを作成します。
余談ですが、今回は単一のクエリを事項するためにExecuteStatement APIを利用しましたが、複数のクエリを実行する場合にはBatchExecuteStatement APIを代わりに利用することができます。
確認
EventBridgeスケジューラが起動するのを待った後、クエリ履歴を確認してみます。
dev=# select user_id, query_id, transaction_id, session_id, database_name, status, start_time, end_time, execution_time, error_message, query_text from SYS_QUERY_HISTORY where user_id = '104' order by start_time limit 10; user_id | query_id | transaction_id | session_id | database_name | status | start_time | end_time | execution_time | error_message | query_text ---------+----------+----------------+------------+---------------+------------+----------------------------+----------------------------+----------------+---------------+---------------------------------------------------------------------------------------------------------- 104 | 5201756 | 116906 | 1073766717 | dev | success | 2023-01-10 09:40:31.695689 | 2023-01-10 09:40:31.697187 | 0 | | SET application_name = 'Amazon Redshift Data API - 2c3bc1e8-c1ca-46a5-ab7b-d0debda9428e - DataAPISingle' 104 | 5201757 | 116907 | 1073766717 | dev | success | 2023-01-10 09:40:31.741247 | 2023-01-10 09:40:31.742829 | 0 | | SELECT pg_backend_pid() 104 | 5201758 | 116908 | 1073766717 | dev | success | 2023-01-10 09:40:31.805927 | 2023-01-10 09:40:31.807268 | 0 | | SELECT 1 as id, 'yagi' as name; 104 | 5201759 | 116910 | 1073766717 | dev | success | 2023-01-10 09:40:31.89581 | 2023-01-10 09:40:31.897129 | 0 | | SELECT pg_last_query_id() (4 rows)
EventBridgeスケジューラに設定した以下のクエリが実行されていることが確認できました。
SELECT 1 as id, 'yagi' as name;
また、Data APIによって自動的に実行される他のクエリも確認できました。
注意点
今回紹介した方法は、EventBridgeからクエリを実行するのみであり、クエリが成功したか失敗したかを検知することはできません。例えば定期クエリに影響があるテーブルのスキーマに変更があった場合、実行自体は正常に行われますが、中身のクエリは失敗します。EventBridge側では実行が行われたかどうかしか検出できないため、クエリが失敗したことに気づくことができません。
クエリの失敗を検出したい場合は、Step FunctionsやApache Airflowなどのワークフロー管理ツールを利用しましょう。
最後に
今回はEventBridgeスケジューラを利用して、Redshift Serverlessに定期的にクエリを実行する方法をご紹介しました。
実際の運用では、エラー検出は重要なため、ワークフローを利用することが多いかと思います。
ユースケースに応じて使い分けて行きましょう。
以上、八木でした!
参考リンク
Amazon Redshift Data API の使用 - Amazon Redshift
ExecuteStatement - Amazon Redshift Data API